[AWS Glue]トリガーが自動で起動しない時の対処方法
こんにちは、CX事業本部の若槻です。
AWSのETLサービスであるAWS Glueでは、トリガーを使用してジョブやクローラーを自動的に起動させることができます。
今回は、AWS Glueのトリガーがなぜか意図通りに動作せずジョブが起動しない時の対処方法を確認してみました。
トリガーの自動起動の仕様について
まず、トリガーのステート(状態)には以下の3つがあります。トリガーが開始されるためにはステートがACTIVATED
である必要があります。
- CREATED:トリガーの作成後
- ACTIVATED:トリガーの開始が有効
- DEACTIVATED:トリガーの開始が無効
そして、Glueのトリガーには以下の3つのタイプがあります。
- Scheduled:スケジュールベースのトリガー
- Conditional:別のジョブやクローラーのステータスを条件にしたトリガー
- On-demand:手動実行のトリガー
このうち「Scheduled」と「Conditional」は、トリガーの自動起動を開始する場合はトリガー作成時にStartOnCreation
を有効にする必要があります。これによりトリガーのステートをACTIVATED
に設定することができます。
StartOnCreation – Boolean.
Set to true to start SCHEDULED and CONDITIONAL triggers when created.
--start-on-creation | --no-start-on-creation (boolean)
Set to true to start SCHEDULED and CONDITIONAL triggers when created.
また、StartOnCreationによるトリガーの開始はトリガー作成時にしか設定できないため、作成済みのトリガーのStartOnCreationが無効の場合はトリガーを再作成する必要があります。
動作確認
CloudFormationによるトリガー作成で前述の仕様を確認してみます。
下記のようにテンプレート内でGlueジョブのトリガーが定義されています。タイプはScheduleベースですがStartOnCreation
は設定していません。
AWSTemplateFormatVersion: '2010-09-09' Resources: //Other Resources SJIStoUTF8JobGlueTrigger: Type: AWS::Glue::Trigger Properties: Name: sjis-to-utf8-job-glue-trigger Schedule: cron(0 2 * * ? *) Type: SCHEDULED Actions: - JobName: !Ref SJIStoUTF8GlueJob
スタックをデプロイしてトリガーを作成します。
% aws cloudformation deploy \ --template-file template.yaml \ --stack-name ETL-Stack \ --capabilities CAPABILITY_NAMED_IAM \ --no-fail-on-empty-changeset
作成したトリガーをAWS CLIで取得してみると"State": "CREATED"
となっています。よってこのトリガーはスケジュールや条件を満たしてもトリガーは起動しません。
% aws glue get-trigger --name sjis-to-utf8-job-glue-trigger { "Trigger": { "Name": "sjis-to-utf8-job-glue-trigger", "Type": "SCHEDULED", "State": "CREATED", "Schedule": "cron(0 2 * * ? *)", "Actions": [ { "JobName": "sjis-to-utf8-job" } ] } }
次にリソース定義にStartOnCreation: true
を追記してリソースを更新してみます。
AWSTemplateFormatVersion: '2010-09-09' Resources: //Other Resources SJIStoUTF8JobGlueTrigger: Type: AWS::Glue::Trigger Properties: Name: sjis-to-utf8-job-glue-trigger Schedule: cron(0 2 * * ? *) Type: SCHEDULED Actions: - JobName: !Ref SJIStoUTF8GlueJob StartOnCreation: true
% aws cloudformation deploy \ --template-file template.yaml \ --stack-name ETL-Stack \ --capabilities CAPABILITY_NAMED_IAM \ --no-fail-on-empty-changeset
更新したトリガーを取得してみると、ステータスはCREATED
のまま変わっていません。引き続きトリガーは自動で開始しないようになっています。
% aws glue get-trigger --name sjis-to-utf8-job-glue-trigger { "Trigger": { "Name": "sjis-to-utf8-job-glue-trigger", "Type": "SCHEDULED", "State": "CREATED", "Schedule": "cron(0 2 * * ? *)", "Actions": [ { "JobName": "sjis-to-utf8-job" } ] } }
そこで下記のようにしてトリガーのリソースを一度削除してから再作成してみます。
- スタックの記述からリソース定義を削除
- スタックをデプロイしてAWS上から削除
- スタックの記述にリソース定義を追加
- スタックをデプロイしてAWS上に作成
こうして再作成したトリガーを取得してみると、今度はちゃんとステートがACTIVATED
となっています。
% aws glue get-trigger --name sjis-to-utf8-job-glue-trigger { "Trigger": { "Name": "sjis-to-utf8-job-glue-trigger", "Type": "SCHEDULED", "State": "ACTIVATED", "Schedule": "cron(0 2 * * ? *)", "Actions": [ { "JobName": "sjis-to-utf8-job" } ] } }
これでGlueのトリガーをスケジュールや条件を満たした際に自動開始できるようになりました。
まとめ
Glueのトリガーが意図した通りに自動起動しない時は以下の対処を行いましょう。
- トリガーのステートが
ACTIVATED
であることを確認する ACTIVATED
でない場合は、StartOnCreation
を有効にしてトリガーの再作成を行う
おわりに
AWS Glueのトリガーがなぜか意図通りに動作せずジョブが起動しない時の対処方法を確認してみました。
Glueのトリガーを使い始めた際に必ずと言って良いほどはまるポイントなので押さえておきましょう。
参考
以上